Các biện pháp phòng chống từ mức nền tảng hệ thống (platform-level) là những biện pháp cải tiến trong thời gian hoạt động (runtime) hoặc các thay
đổi trong cấu hình sao cho có thể nâng cao mức độ an ninh tổng thể của ứng dụng.
Một điều luôn cần ghi nhớ, đó là các giải pháp mức nền tảng hệ thống không thể thay thế cho việc xây dựng mã nguồn ứng dụng an toàn, chúng chỉ
có tác dụng hỗ trợ. Một database cấu hình tốt không ngăn chặn được SQL Injection nhưng sẽ khiến chúng gặp khó khăn khi lợi dụng điểm yếu ứng dụng
để khai thác database, một bộ lọc an ninh có thể được sử dụng tạm thời như
một bản vá ảo (virtual patch) từ khi phát hiện lỗ hổng đến khi đội phát triển
ứng dụng khắc phục được lỗ hổng đó. Các bộ lọc có thể được xây dựng nhanh chóng hơn và có thể phòng tránh được những lỗ hổng trong giai đoạn zero-day của cuộc tấn công. Và có thể khẳng định rằng, an ninh mức nền tảng là một thành phần quan trọng trong chiến lược an ninh tổng thể của ứng dụng.
3.2.1. Các biện pháp bảo vệ tức thời
Những biện pháp bảo vệ tức thời là những biện pháp có thể áp dụng mà không cần phải thực hiện biên dịch lại mã nguồn của ứng dụng. Các biện pháp bảo vệ trong thời gian hoạt động là các công cụ hữu ích nhằm phòng tránh việc lợi dụng các điểm yếu SQL Injection đã được xác định. Việc thực hiện sửa lỗi trong mã nguồn ứng dụng luôn là một giải
pháp triệt để nhưng không phải luôn thực hiện được với khả năng và chi phí có thể. Ngoài ra, với các ứng dụng thương mại, hầu hết chúng được phát hành với bản hoàn chỉnh đã biên dịch chứ không phải ở dạng mã nguồn. Và ngay cả khi có mã nguồn thì việc thực hiện chỉnh sửa nó hầu hết đều vi phạm các điều khoản sử dụng và các chính sách bảo hành, hỗ
trợ của nhà phân phối. Và do đó, việc sử dụng các biện pháp bảo vệ
trong thời gian hoạt động có thể là giải pháp dạng bản-vá-ảo (virtual patch) tạm thời trước khi việc sửa lỗi trong mã nguồn ứng dụng hoàn chỉnh.
Ngay cả khi thời gian, tài nguyên cần thiết cho phép việc vá lỗi trong mã nguồn, các biện pháp bảo vệ trong thời gian chạy vẫn là một lớp an ninh có giá trị cho việc phát hiện hoặc ngăn chặn những điểm yếu SQL Injection chưa biết tới. Điều này sẽ dễ nhận thấy khi mà ứng dụng chưa từng trải qua các đánh giá, thử nghiệm bảo mật, hoặc chưa từng bị các cuộc tấn công SQL Injection – những điều mà rất phổ biến trong hoạt
động phát triển ứng dụng Web ở nước ta hiện nay. Rõ ràng, đây là những tiền đề cho việc khai thác các lỗi zero-day cũng như các lỗi SQL khác phát tán từ Internet. Lúc này, các phương pháp của chúng ta không chỉ mang tính đối phó bịđộng (reactive) mà còn cung cấp các biện pháp
đối phó chủđộng (proactive) cho ứng dụng.
a. Các ứng dụng tường lửa Web
Ứng dụng tường lửa Web (Web Application Firewall - WAF) là một ứng dụng được bố trí đóng vai trò trung gian giữa client và web server, làm nhiệm vụ điều phối các thông tin luân chuyển, cân bằng tải, … một ứng dụng WAF sẽđược bố trí như sau:
Ưu điểm:
Đòi hỏi ít thay đổi tới web server và ứng dụng web
Là một tiêu chuẩn đối với các hệ thống thanh toán điện tử (tiêu chuẩn PCI DSS v1.1 ), tham khảo tại PCI Data Security Standard .
Cập nhật nhanh, đơn giản
Hỗ trợ phòng tránh nhiều loại hình tấn công
Nhược điểm:
Có thể gia tăng độ phức tạp của hệ thống hiện tại, nhất là khi triển khai kèm proxy
Chi phí đào tạo trong quá trình kiểm thử và khi nâng cấp phiên bản mới
Gia tăng độ phức tạp của các hoạt động gỡ lỗi, do WAF cũng trả về các lỗi, và WAF chịu trách nhiệm xử
lý các tình huống của toàn bộ hệ thống.
Tính kinh tế có thể không đảm bảo như nhà quản lý mong muốn.
Một số sản phẩm tiêu biểu
Miễn phí: ModSecurity, AppArmor, UFW
(uncomplicated firewall), …
Có phí: Barracuda, Cisco ACE, Citrix NetScale, … Trong phần phụ lục chúng ta sẽđề cập khái quát về việc sử dụng ModProxy để phòng chống một số dạng tấn công SQL Injection
b. Các bộ lọc ngăn chặn
Hầu hết các ứng dụng tường lửa web (WAF) đều cài đặt các mẫu lọc ngăn chặn trong cấu trúc của mình. Các bộ lọc này là một chuỗi các module độc lập có thể được gắn kết với nhau để thực hiện thao tác xử lý trước và sau các xử lý chính bên trong ứng dụng (Web page, URL, script). Các bộ lọc đều không có sự ràng buộc rõ rệt nào với nhau, do đó nó cho phép triển khai thêm các mẫu lọc mới mà không hề ảnh hưởng tới những cái sẵn có. Chúng ta sẽđề cập tới hai cách triển khai các bộ lọc ngăn chặn phổ biến nhất, đó là dưới dạng các plug-in cho Web server và dưới dạng các module cho nền tảng phát triển ứng dụng
Bộ lọc dạng Plug-in cho Web server
Ở dạng này, các bộ lọc được tích hợp vào Web server dưới dạng plug-in/module, đảm nhiệm việc mở rộng khả năng của Web server sang các tác vụ xử lý.
Thông thường các request và response được xử lý ở Web server phải trải qua vài pha xử lý, các plug-in lọc có thể đăng kí chạy ở những pha này, thực hiện xử lý trước khi các request tới
được ứng dụng Web hoặc ngay sau khi ứng dụng Web trả về các response. Những xử lý này độc lập và không ảnh hưởng tới các module khác của Web server hay không làm thay đổi logic nghiệp vụ của nó.
Một ưu điểm dễ thấy khi triển khai dạng module của Web server đó là các bộ lọc này sẽ không phụ thuộc vào nền tảng của
ứng dụng Web hoặc ngôn ngữ lập trình, ví dụ các bộ lọc ISAPI cho Microsoft IIS có thể xử lý và theo dõi các request trên cả
ASP và ASP.NET.
Do các bộ lọc tham gia xử lý tất cả các request nên vấn đề
hiệu năng được đặc biệt coi trọng, các plugin đều được viết bằng C/C++ để có thể chạy nhanh hơn. Tuy nhiên khi dùng các ngôn ngữ này sẽ dễ nảy sinh các điểm yếu về tràn bộđệm hay về định dạng xâu ký tự.
Dạng module hỗ trợ cho nền tảng phát triển ứng dụng
Dạng module lọc này cho phép chúng ta cài đặt chúng bên trong mã nguồn ứng dụng web hoặc framework. Dạng module này khá tương đồng với dạng plug-in cho Web server ở chỗ các
đoạn code ở dạng module, có thểđược cài đặt kèm theo từng pha xử lý request từ client. Trong ASP.NET chúng ta có interface tên là Web.IhttpModule và trong Java chúng ta có javax.servlet.Filter
để cài đặt các mẫu lọc.
Các module này có thể được cài đặt độc lập, không làm thay đổi hoạt động của ứng dụng Web. Ngoài ra, chúng cũng có thểđược phát triển độc lập thành các thư viện .dll và jar và có thể được khởi chạy ngay.
3.2.2. Các biện pháp bảo vệ database
Các biện pháp bảo vệ chính database nhằm đề phòng những trường hợp xấu, khi kẻ tấn công đã khai thác được điểm yếu, và từ đó có thể điều khiển các hoạt động của database nhằm ăn cắp dữ liệu hoặc làm bàn đạp thâm nhập vào hệ thống bên trong, đằng sau database.
a. Giới hạn phạm vi ảnh hưởng của ứng dụng
Các biện pháp này được chuẩn bị, đề phòng cho tình huống xấu nhất khi kẻ tấn công có thể thâm nhập được vào database:
Cấp quyền ưu tiên tối thiểu cho tài khoản đăng nhập vào database
Hủy bỏ các quyền PUBLIC: các database thường cung cấp một số chế độ mặc định cho tất cả các đăng nhập, các chế độ này có một tập mặc định các quyền, bao gồm cả việc truy cập tới một số đối tượng thuộc hệ thống. Các chếđộ công khai này đôi khi cung cấp những quyền truy cập tới những stored procedure có sẵn, một số các gói, hoặc các hàm có thể sử dụng cho mục đích quản trị. Vì vậy cần hủy quyền dạng này tới mức tối đa có thể.
Sử dụng các Stored procedure: trường hợp này, các stored procedure có vai trò đóng gói các quyền ứng dụng cần vừa đủđể
thực hiện công việc của mình.
Sử dụng các thuật toán mã hóa mạnh để mã hóa và lưu trữ những dữ liệu nhạy cảm.
b. Giới hạn phạm vi ảnh hưởng của database
Các biện pháp ở mức này được chuẩn bị, đề phòng cho tình huống kẻ tấn công chiếm được quyền điều khiển database:
- Khóa các quyền truy cập tới các đối tượng có đặc quyền, ví dụ những tiện ích quản trị, tiện ích thực thi gián tiếp các lệnh phía hệ điều hành, hoặc các tiện ích sinh các kết nối tới các đối tượng, database khác. - Hạn chế các truy vấn đặc biệt (ad hoc query): câu lệnh OPENROWSET
trong SQL Server là một ví dụ. Việc sử dụng câu lệnh này có thể giúp kẻ
tấn công có thể cướp quyền truy vấn, và thực hiện các kết nối tới các database khác dưới chếđộ xác thực lỏng lẻo hơn.
- Luôn cập nhật các bản vá mới nhất của ứng dụng quản trị database (DBMS). Đây là một nguyên tắc căn bản mà chúng ta cần tuân thủ, bởi các bản vá này có thể không cập nhật nhanh nhất nhưng nó có tính đảm bảo cho các điểm yếu đã được phát hiện.
3.3. Đề xuất một số giải pháp
Thực tế cho thấy không một hệ thống ứng dụng Web nào được coi là an ninh tuyệt đối. Các giải pháp an ninh hệ thống chỉ có thể hướng tới việc bảo vệ
hệ thống một cách tối đa, và giảm thiểu các nguy cơ tấn công xuống mức tối thiểu. Một mô hình an ninh nhiều mức là một sự lựa chọn sáng suốt cho vấn đề
này.
Các biện pháp an ninh chúng ta đã đề cập tới bao gồm các biện pháp quản lý luồng thông tin trao đổi giữa ứng dụng và database server như: lọc request từ client thông qua tường lửa Web, chuẩn hóa các tham số lấy được từ
request, xây dựng các truy vấn tham số hóa, lọc tiếp lần cuối các http response tại tường lửa Web. Ngoài ra còn cần áp dụng các biện pháp an ninh mức nền tảng hệ thống.
Chúng ta có thể hệ thống lại các giải pháp an ninh ứng dụng đã đề cập theo một mô hình sau.
Hình 3.2 – mô hình đề xuất
Trong mô hình trên, quá trình xử lý request từ phía người dùng trải qua 6 giai đoạn:
- Nhận request từ client (các tham số đầu vào do người dùng toàn quyền
điều khiển). Giai đoạn này chúng ta không can thiệp được.
- Xử lý request ở tường lửa Web: trong giai đoạn này các luật lọc ở tường lửa Web sẽ giúp chặn lại các request có URL, tham số tiềm ẩn nguy cơ
tấn công.
- Chuẩn hóa dữ liệu thu được từ request trong mã nguồn ứng dụng. Giai
đoạn này thực hiện kiểm tra, chuẩn hóa các dữ liệu từ phía người dùng, một số thao tác cần tiến hành như kiểm tra kiểu dữ liệu, kiểm tra độ dài dữ liệu (đề phòng Buffer overflow), …
- Sinh các truy vấn theo mô hình tham số hóa (parameterized query hay prepared query). Các truy vấn này sẽđược DBMS tối ưu, khi thực thi sẽ
nhận các tham sốđã chuẩn hóa ở giai đoạn trước vào để có câu truy vấn hoàn chỉnh
- Xử lý kết quả từ database trả về, sinh các kết quảđể HTML gửi về client thông qua các thông điệp phản hồi (HTTP response)
- Thông điệp phản hồi (HTTP response) sẽ được qua tường lửa Web lọc các thông tin trong đó nhằm loại bỏ các request có rò rỉ dữ liệu nhạy cảm.
- Các thông điệp phản hồi sau khi được kiểm tra sẽđược trả về cho client. Giai đoạn này ứng dụng không kiểm soát được.
Mô hình trên nên được áp dụng cho tất cả các ứng dụng Web nhằm đảm bảo an ninh tối đa trước các cuộc tấn công SQL Injection. Trong mô hình trên, chúng ta đã thực hiện được việc kiểm soát dữ liệu đầu vào của người dùng thông qua các bước xử lý khác nhau. Việc xử lý request từ mức tường lửa sẽ
giúp giảm thiểu được gánh nặng xử lý cho ứng dụng bên trong, đồng thời tiết kiệm được băng thông cho hệ thống. Các tham số chuẩn hóa sẽ giúp các truy vấn SQL (trực tiếp hoặc thông qua các Stored Procedure) được thực thi an toàn hơn. Và cuối cùng, các thông tin có thể bị rò rỉ trong thông điệp phản hồi sẽ được kiểm tra lần nữa trước khi chuyển về cho client.
Phụ lục:
Cấu hình ModSecurity phòng chống SQL Injection.